﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;

namespace Utils
{
    public static class EnumUtil
    {
        // 获取枚举值的Description属性值，如果没有则返回枚举名（泛型版本）
        public static string GetDescription<T>(T value) where T : Enum
        {
            return GetDescriptionImpl(value as Enum);
        }

        // 获取枚举值的Description属性值，如果没有则返回枚举名（非泛型扩展方法）
        public static string GetDescription(this Enum value)
        {
            return GetDescriptionImpl(value);
        }

        // 实现
        private static string GetDescriptionImpl(Enum value)
        {
            if (value == null)
                return string.Empty;

            Type type = value.GetType();
            string name = Enum.GetName(type, value);

            if (name == null)
                return value.ToString();

            FieldInfo field = type.GetField(name);

            if (field == null)
                return value.ToString();


            return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is not DescriptionAttribute attribute ? value.ToString() : attribute.Description;
        }

        // 将枚举转换为键值对列表
        public static List<KeyValuePair<int, string>> GetEnumAsList(Type enumType)
        {
            if (enumType == null)
                throw new ArgumentNullException(nameof(enumType));

            if (!enumType.IsEnum)
                throw new ArgumentException("不是枚举类型", nameof(enumType));

            return Enum.GetValues(enumType)
                .Cast<Enum>()
                .Select(e => new KeyValuePair<int, string>(
                    Convert.ToInt32(e),
                    e.GetDescription() // 使用扩展方法
                ))
                .ToList();
        }

        /// <summary>
        /// 获取枚举值的数字表示
        /// </summary>
        public static int GetNumericValue<TEnum>(TEnum enumValue) where TEnum : Enum
        {
            return Convert.ToInt32(enumValue);
        }

    }
}